/**
 * Created with IntelliJ IDEA.
 * Description:循环队列：力扣622题
 * User: 86187
 * Date: 2022-07-30
 * Time: 10:37
 */

class MyCircularQueue {
    //循环队列！如何判空？如何判满？
    //1、浪费一个空间来区分队满和队空
    //2、利用计数器
    //此处用方法1

    public int[] elem;
    public int usedSize;//此处用方法1，usedSize可要可不要
    public int front;//队头下标
    public int rear;//队尾下标

    public MyCircularQueue(int k) {
        //初始化数组
        elem = new int[k+1];
    }

    //入队
    public boolean enQueue(int value) {

        if(isFull()) {
            //如果扩容就需要更新front 和 rear 在此不需要扩容
            return false;
        }

        elem[rear] = value;
        //rear不能单纯的加1：这是循环队列，若数组长度为k,
        //则需要考虑从下标k-1（该下标不放元素）处循环到0下标处
        rear = (rear+1) % elem.length;
        usedSize++;
        return true;
    }

    //出队
    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }
        //front不能单纯的加1: 这是循环队列，若数组长度为k,
        //则需要考虑从下标k-1（该下标不放元素）处循环到0下标处
        front = (front + 1) % elem.length;
        usedSize--;

        return true;
    }

    //获取队头元素
    public int Front() {
        if(isEmpty()) {
            return -1;//队列为空，返回-1
        }
        return elem[front];
    }

    //获取队尾元素
    public int Rear() {
        if(isEmpty()) {
            return -1;//队列为空，返回-1
        }
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];
    }

    public boolean isEmpty() {
        //判断 队 是否为空
        return rear == front;
        //return usedSize == 0;
    }

    public boolean isFull() {
        //判断 队 是否满了
        return (rear+1) % elem.length == front;
        //return usedSize == elem.length;
    }
}
